home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Mac / Lib / macostools.py < prev    next >
Text File  |  1996-03-12  |  2KB  |  97 lines

  1. """macostools - Various utility functions for MacOS.
  2.  
  3. mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
  4. copy(src, dst) - Full copy of 'src' to 'dst'
  5. """
  6.  
  7. import macfs
  8. import Res
  9. import os
  10. from MACFS import *
  11. import MacOS
  12. try:
  13.     openrf = MacOS.openrf
  14. except AttributeError:
  15.     # Backward compatability
  16.     openrf = open
  17.  
  18. Error = 'macostools.Error'
  19.  
  20. FSSpecType = type(macfs.FSSpec(':'))
  21.  
  22. BUFSIZ=0x80000        # Copy in 0.5Mb chunks
  23.  
  24. #
  25. # Not guaranteed to be correct or stay correct (Apple doesn't tell you
  26. # how to do this), but it seems to work.
  27. #
  28. def mkalias(src, dst):
  29.     """Create a finder alias"""
  30.     srcfss = macfs.FSSpec(src)
  31.     dstfss = macfs.FSSpec(dst)
  32.     alias = srcfss.NewAlias()
  33.     srcfinfo = srcfss.GetFInfo()
  34.  
  35.     Res.FSpCreateResFile(dstfss, srcfinfo.Creator, srcfinfo.Type, -1)
  36.     h = Res.FSpOpenResFile(dstfss, 3)
  37.     resource = Res.Resource(alias.data)
  38.     resource.AddResource('alis', 0, '')
  39.     Res.CloseResFile(h)
  40.     
  41.     dstfinfo = dstfss.GetFInfo()
  42.     dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
  43.     dstfss.SetFInfo(dstfinfo)
  44.     
  45. def mkdirs(dst):
  46.     """Make directories leading to 'dst' if they don't exist yet"""
  47.     if dst == '' or os.path.exists(dst):
  48.         return
  49.     head, tail = os.path.split(dst)
  50.     print 'XX', dst, '->', (head, tail)
  51.     # XXXX Is this a bug in os.path.split?
  52.     if not ':' in head:
  53.         head = head + ':'
  54.     mkdirs(head)
  55.     os.mkdir(dst, 0777)
  56.     
  57. def copy(src, dst, createpath=0):
  58.     """Copy a file, including finder info, resource fork, etc"""
  59.     if createpath:
  60.         mkdirs(os.path.split(dst)[0])
  61.     srcfss = macfs.FSSpec(src)
  62.     dstfss = macfs.FSSpec(dst)
  63.     
  64.     ifp = open(srcfss.as_pathname(), 'rb')
  65.     ofp = open(dstfss.as_pathname(), 'wb')
  66.     d = ifp.read(BUFSIZ)
  67.     while d:
  68.         ofp.write(d)
  69.         d = ifp.read(BUFSIZ)
  70.     ifp.close()
  71.     ofp.close()
  72.     
  73.     ifp = openrf(srcfss.as_pathname(), '*rb')
  74.     ofp = openrf(dstfss.as_pathname(), '*wb')
  75.     d = ifp.read(BUFSIZ)
  76.     while d:
  77.         ofp.write(d)
  78.         d = ifp.read(BUFSIZ)
  79.     ifp.close()
  80.     ofp.close()
  81.     
  82.     sf = srcfss.GetFInfo()
  83.     df = dstfss.GetFInfo()
  84.     df.Creator, df.Type = sf.Creator, sf.Type
  85.     df.Flags = (sf.Flags & (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias))
  86.     dstfss.SetFInfo(df)
  87.     
  88. def copytree(src, dst):
  89.     """Copy a complete file tree to a new destination"""
  90.     if os.path.isdir(src):
  91.         mkdirs(dst)
  92.         files = os.listdir(src)
  93.         for f in files:
  94.             copytree(os.path.join(src, f), os.path.join(dst, f))
  95.     else:
  96.         copy(src, dst, 1)
  97.